home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / proasm / routines / parse.r < prev    next >
Text File  |  1994-07-17  |  4KB  |  220 lines

  1.  
  2. ;---;  parse.r  ;--------------------------------------------------------------
  3. *
  4. *    ****    TEXT PARSE ROUTINES    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Add. Code    Daniel Weber
  8. *    Version        1.01
  9. *    Last Revision    02.03.92
  10. *    Identifier    pre_defined
  11. *       Prefix        pre_    (parse)
  12. *                 ¯ ¯ ¯
  13. *    Functions    RemoveSpaces, CopyLine, CopyZeroText, NextLine
  14. *
  15. ;------------------------------------------------------------------------------
  16.  
  17. ;------------------
  18.     ifnd    pre_defined
  19. pre_defined    =1
  20.  
  21. ;------------------
  22. pre_oldbase    equ __base
  23.     base    pre_base
  24. pre_base:
  25.  
  26. ;------------------
  27.  
  28. ;------------------------------------------------------------------------------
  29.  
  30. ;------------------
  31. ; REMOVESPACES
  32. ;    Jumps to next char that is not a space or tab
  33. ;
  34. ;    a0=text position    =>    next text position
  35. ;
  36.     IFD    xxx_RemoveSpaces
  37. RemoveSpaces:
  38.     cmp.b    #$20,(a0)+
  39.     beq.s    RemoveSpaces
  40.     subq.w    #1,a0
  41.     cmp.b    #$9,(a0)+
  42.     beq.s    RemoveSpaces
  43.     subq.w    #1,a0
  44.     rts
  45.  
  46.     ENDC
  47.  
  48. ;------------------
  49. ; COPYLINE
  50. ;     Copies text from the current position to the end of line or begin
  51. ;    of comments. Jumps directly after next <CR> and leaves all kinds of
  52. ;    comments out. Maximum chars that are copied are 256, endchar is zero.
  53. ;    spaces before text end are removed. tabs are converted to spaces.
  54. ;    stuff in ' or " will be left intact and copied unchanged.
  55. ;    Source text must end with zero byte!
  56. ;
  57. ;    a0=text position    =>    next text position
  58. ;    a1=buffer        =>    points after <CR>
  59. ;    d0            =>    number of bytes or 0 if EOF
  60. ;    d1=number of this line    =>    number of next line
  61. ;    ccr            =>    set on test d0
  62. ;
  63.     IFD    xxx_CopyLine
  64. CopyLine:
  65.     move.l    d2,-(sp)
  66.     move.l    d1,d2
  67.     moveq    #0,d0
  68.     tst.b    (a0)        ;end char reached?
  69.     beq.s    \done
  70.  
  71. \copychar:
  72.     addq.w    #1,d0
  73.     move.b    (a0)+,d1
  74.     cmp.b    #";",d1
  75.     beq.s    \remcomment
  76.     cmp.b    #"*",d1
  77.     beq.s    \remcomment
  78.     cmp.b    #"\",d1
  79.     bne.s    \nocomment
  80.     cmp.b    #"*",(a0)
  81.     beq.s    \remmulticomment
  82.  
  83. \nocomment:
  84.     cmp.b    #$a,d1
  85.     beq.s    \crend
  86.     cmp.b    #$9,d1
  87.     bne.s    \notab
  88.     moveq    #" ",d1
  89. \notab:
  90.     move.b    d1,(a1)+
  91.     cmp.b    #'"',d1
  92.     beq.s    \forcetext
  93.     cmp.b    #"'",d1
  94.     beq.s    \forcetext
  95.     cmp.w    #256,d0
  96.     blt.s    \nomax
  97.     subq.w    #1,a1
  98.     subq.w    #1,d0
  99. \nomax:
  100.     bra.s    \copychar
  101.  
  102. ;------------------
  103. \crend:
  104.     addq.l    #1,d2
  105. \ending:
  106.     subq.w    #1,d0
  107.     beq.s    \setend
  108.     cmp.b    #$20,-(a1)
  109.     beq.s    \ending
  110.     addq.w    #1,a1
  111.  
  112. \setend:
  113.     clr.b    (a1)+
  114.     addq.w    #1,d0
  115.  
  116. \done:
  117.     move.l    d2,d1
  118.     move.l    (sp)+,d2
  119.     tst.w    d0
  120.     rts
  121.  
  122. ;------------------
  123. ; remove comment with ';' or '*'
  124. ;
  125. \remcomment:
  126.     tst.b    (a0)
  127.     beq.s    \ending
  128.     cmp.b    #$a,(a0)+
  129.     bne.s    \remcomment
  130.     bra.s    \crend
  131.  
  132. ;------------------
  133. ; remove comment in \* *\, stuff right after *\ will be declared
  134. ; as new line, even if it's only a <CR>
  135. ;
  136. \remmulticomment:
  137.     move.b    (a0),d1
  138.     beq.s    \ending
  139.     addq.w    #1,a0
  140.     cmp.b    #$a,d1
  141.     bne.s    \nocomcr
  142.     addq.l    #1,d2
  143. \nocomcr:
  144.     cmp.b    #"*",d1
  145.     bne.s    \remmulticomment
  146.     cmp.b    #"\",(a0)
  147.     bne.s    \remmulticomment
  148.     addq.w    #1,a0
  149.     bra.s    \ending
  150.     
  151. ;------------------
  152. ; copy text in ' or "
  153. ;
  154. \forcetext:
  155.     tst.b    (a0)
  156.     beq.s    \ending
  157.     addq.w    #1,d0
  158.     cmp.b    #$a,(a0)+
  159.     beq.s    \crend
  160.     move.b    -(a0),(a1)+
  161.     cmp.w    #256,d0
  162.     blt.s    \noover
  163.     subq.w    #1,d0
  164.     subq.w    #1,a1
  165. \noover:    
  166.     cmp.b    (a0)+,d1
  167.     bne.s    \forcetext
  168.     bra.s    \nomax
  169.     
  170.  
  171.     ENDC
  172.  
  173. ;------------------
  174. ; COPYZEROTEXT
  175. ;    Copies a zeroterminated text
  176. ;
  177. ;    a0=destination        =>    next text position
  178. ;    a1=text to be copied
  179. ;
  180.     IFD    xxx_CopyZeroText
  181. CopyZeroText:
  182.     move.b    (a1)+,(a0)+
  183.     bne.s    CopyZeroText
  184.     subq.w    #1,a0
  185.     rts
  186.     ENDC
  187.  
  188. ;------------------
  189. ; NEXTLINE
  190. ;    move current position to next line
  191. ;    LF and null-byte accepted as eol characters.
  192. ;
  193. ;    a0: text
  194. ;
  195.     IFD    xxx_NextLine
  196. NextLine:
  197.     cmp.b    #$a,(a0)
  198.     beq.s    .out
  199.     tst.b    (a0)+
  200.     bne.s    NextLine
  201.     subq.l    #1,a0
  202. .out:    addq.l    #1,a0
  203.     rts
  204.     ENDC
  205.     
  206.  
  207.  
  208. ;------------------
  209.  
  210. ;--------------------------------------------------------------------
  211.  
  212. ;------------------
  213.     base    pre_oldbase
  214.  
  215. ;------------------
  216.     endif
  217.  
  218.  end
  219.  
  220.